Mercurial > hgsubversion
comparison fetch_command.py @ 103:f9d0154e4d11
fetch_command: simplify diff code with opener objects
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Tue, 25 Nov 2008 09:18:26 -0600 |
parents | 3d56b8c53979 |
children | f046564b2916 |
comparison
equal
deleted
inserted
replaced
102:3d56b8c53979 | 103:f9d0154e4d11 |
---|---|
338 our_tempdir = None | 338 our_tempdir = None |
339 diff_path = make_diff_path(b) | 339 diff_path = make_diff_path(b) |
340 parent_rev, br_p = hg_editor.get_parent_svn_branch_and_rev(r.revnum, b) | 340 parent_rev, br_p = hg_editor.get_parent_svn_branch_and_rev(r.revnum, b) |
341 parent_ha = hg_editor.get_parent_revision(r.revnum, b) | 341 parent_ha = hg_editor.get_parent_revision(r.revnum, b) |
342 files_touched = set() | 342 files_touched = set() |
343 link_files = {} | |
344 exec_files = {} | |
345 try: | 343 try: |
346 if br_p == b: | 344 if br_p == b: |
347 # letting patch handle binaries sounded | 345 # letting patch handle binaries sounded |
348 # cool, but it breaks patch in sad ways | 346 # cool, but it breaks patch in sad ways |
349 d = svn.get_unified_diff(diff_path, r.revnum, deleted=False, | 347 d = svn.get_unified_diff(diff_path, r.revnum, deleted=False, |
356 if d: | 354 if d: |
357 ui.status('Branch creation with mods, pulling full rev.\n') | 355 ui.status('Branch creation with mods, pulling full rev.\n') |
358 raise BadPatchApply() | 356 raise BadPatchApply() |
359 | 357 |
360 our_tempdir = tempfile.mkdtemp('svn_fetch_temp', dir=temp_location) | 358 our_tempdir = tempfile.mkdtemp('svn_fetch_temp', dir=temp_location) |
359 opener = merc_util.opener(our_tempdir) | |
361 for m in binary_file_re.findall(d): | 360 for m in binary_file_re.findall(d): |
362 # we have to pull each binary file by hand as a fulltext, | 361 # we have to pull each binary file by hand as a fulltext, |
363 # which sucks but we've got no choice | 362 # which sucks but we've got no choice |
364 file_path = os.path.join(our_tempdir, m) | |
365 files_touched.add(m) | 363 files_touched.add(m) |
366 try: | 364 try: |
367 try: | 365 f = opener(m, 'w') |
368 os.makedirs(os.path.dirname(file_path)) | |
369 except OSError, e: | |
370 pass | |
371 f = open(file_path, 'w') | |
372 f.write(svn.get_file(diff_path+'/'+m, r.revnum)[0]) | 366 f.write(svn.get_file(diff_path+'/'+m, r.revnum)[0]) |
373 f.close() | 367 f.close() |
374 except IOError: | 368 except IOError: |
375 pass | 369 pass |
376 d2 = empty_file_patch_wont_make_re.sub('', d) | 370 d2 = empty_file_patch_wont_make_re.sub('', d) |
377 d2 = property_exec_set_re.sub('', d2) | 371 d2 = property_exec_set_re.sub('', d2) |
378 d2 = property_exec_removed_re.sub('', d2) | 372 d2 = property_exec_removed_re.sub('', d2) |
379 old_cwd = os.getcwd() | |
380 os.chdir(our_tempdir) | |
381 for f in any_file_re.findall(d): | 373 for f in any_file_re.findall(d): |
374 if f in files_touched: | |
375 # this check is here because modified binary files will get | |
376 # created before here. | |
377 continue | |
382 files_touched.add(f) | 378 files_touched.add(f) |
383 # this check is here because modified binary files will get | 379 data = '' |
384 # created before here. | 380 if f in hg_editor.repo[parent_ha]: |
385 if os.path.exists(f): | 381 data = hg_editor.repo[parent_ha][f].data() |
386 continue | 382 fp = opener(f, 'w') |
387 dn = os.path.dirname(f) | 383 fp.write(data) |
388 if dn and not os.path.exists(dn): | 384 fp.close() |
389 os.makedirs(dn) | |
390 if f in hg_editor.repo[parent_ha].manifest(): | |
391 data = hg_editor.repo[parent_ha].filectx(f).data() | |
392 fi = open(f, 'w') | |
393 fi.write(data) | |
394 fi.close() | |
395 else: | |
396 open(f, 'w').close() | |
397 os.chdir(old_cwd) | |
398 if d2.strip() and len(re.findall('\n[-+]', d2.strip())) > 0: | 385 if d2.strip() and len(re.findall('\n[-+]', d2.strip())) > 0: |
399 old_cwd = os.getcwd() | 386 old_cwd = os.getcwd() |
400 os.chdir(our_tempdir) | 387 os.chdir(our_tempdir) |
401 changed = {} | 388 changed = {} |
402 try: | 389 try: |
440 r.revnum) | 427 r.revnum) |
441 | 428 |
442 # we create the files if they don't exist here because we know | 429 # we create the files if they don't exist here because we know |
443 # that we'll never have diff info for a deleted file, so if the | 430 # that we'll never have diff info for a deleted file, so if the |
444 # property is set, we should force the file to exist no matter what. | 431 # property is set, we should force the file to exist no matter what. |
432 exec_files = {} | |
445 for m in property_exec_removed_re.findall(d): | 433 for m in property_exec_removed_re.findall(d): |
434 exec_files[m] = False | |
435 for m in property_exec_set_re.findall(d): | |
436 exec_files[m] = True | |
437 for m in exec_files: | |
438 files_touched.add(m) | |
446 f = os.path.join(our_tempdir, m) | 439 f = os.path.join(our_tempdir, m) |
447 if not os.path.exists(f): | 440 if not os.path.exists(f): |
448 d = os.path.dirname(f) | 441 data = '' |
449 if not os.path.exists(d): | 442 if m in hg_editor.repo[parent_ha]: |
450 os.makedirs(d) | 443 data = hg_editor.repo[parent_ha][m].data() |
451 if not m in hg_editor.repo[parent_ha].manifest(): | 444 fp = opener(m, 'w') |
452 open(f, 'w').close() | 445 fp.write(data) |
453 else: | 446 fp.close() |
454 data = hg_editor.repo[parent_ha].filectx(m).data() | 447 link_files = {} |
455 fp = open(f, 'w') | |
456 fp.write(data) | |
457 fp.close() | |
458 exec_files[m] = False | |
459 files_touched.add(m) | |
460 for m in property_exec_set_re.findall(d): | |
461 f = os.path.join(our_tempdir, m) | |
462 if not os.path.exists(f): | |
463 d = os.path.dirname(f) | |
464 if not os.path.exists(d): | |
465 os.makedirs(d) | |
466 if m not in hg_editor.repo[parent_ha].manifest(): | |
467 open(f, 'w').close() | |
468 else: | |
469 data = hg_editor.repo[parent_ha].filectx(m).data() | |
470 fp = open(f, 'w') | |
471 fp.write(data) | |
472 fp.close() | |
473 exec_files[m] = True | |
474 files_touched.add(m) | |
475 for m in property_special_set_re.findall(d): | 448 for m in property_special_set_re.findall(d): |
476 # TODO(augie) when a symlink is removed, patching will fail. | 449 # TODO(augie) when a symlink is removed, patching will fail. |
477 # We're seeing that above - there's gotta be a better | 450 # We're seeing that above - there's gotta be a better |
478 # workaround than just bailing like that. | 451 # workaround than just bailing like that. |
479 path = os.path.join(our_tempdir, m) | 452 path = os.path.join(our_tempdir, m) |