diff -ur v9/fsyn.py v10/fsyn.py --- v9/fsyn.py 2020-05-05 12:24:53.000000000 +0900 +++ v10/fsyn.py 2020-05-06 14:49:02.000000000 +0900 @@ -32,6 +32,10 @@ cmd = 'rm -rf ' + path cmd_call( cmd ) +def clear_dir(dir_path): + cmd = '( cd {} ; ls -A | xargs rm -rf )'.format( dir_path ) + cmd_call( cmd ) + cut_tail_sla = lambda path: path[ : -1 ] if path[-1] == '/' else path @@ -253,8 +257,7 @@ show_ids( ids, 'next' ) def ckout_org(): - cmd = '( cd {} ; ls -A | xargs rm -rf )'.format( dir_path ) - cmd_call( cmd ) + clear_dir( dir_path ) targ_id = 'org' fn = id_fn( targ_id, 'update.tgz' ) @@ -371,6 +374,71 @@ msg = k + ':\n' + to_str( lst, pre=' ' ) dbg.out( msg ) + def curr_backup_new(): + ( DIR, BASE ) = os.path.split( dir_path ) + + bak_id = get_curr() + tmp_dir = cmd_ut.mk_tmp_dir( '/tmp/fsyn_diff_' ) + cmd = 'tar czf {}/{} -C {} {}'.format( tmp_dir, 'bak.tgz', DIR, BASE ) + cmd_call( cmd ) + + def restore(): + clear_dir( dir_path ) + cmd = 'tar xzf {}/{} -C {}'.format( tmp_dir, 'bak.tgz', DIR ) + cmd_call( cmd ) + cmd_ut.rm_rf( tmp_dir ) + set_curr( bak_id ) + + return empty.new( locals() ) + + def ckout_force(id): + if id == 'now': + return True + + id = alias_cnv( id ) + if not path_exists( path_join( fsyn_path(), id ) ): + return False + + curr_cmp = get_curr_cmp() + if not curr_cmp.same: # dirty + ckout_org() + ckout( id ) + return True + + def curr_copy(dir_, name): + ( DIR, BASE ) = os.path.split( dir_path ) + cmd = 'tar cf - -C {} {} | tar xf - -C {}'.format( DIR, BASE, dir_ ) + cmd_call( cmd ) + cmd = '( cd {} ; mv {} {} )'.format( dir_, BASE, name ) + cmd_call( cmd ) + + def diff_inner(a, b, curr_backup): + tmp_dir = curr_backup.tmp_dir + + if not ckout_force( b ): + return + curr_copy( tmp_dir, 'b' ) + + if not ckout_force( a ): + return + curr_copy( tmp_dir, 'a' ) + + cmd = '( cd {} ; diff -urN a b )'.format( tmp_dir ) + cmd_ut.call_show( cmd ) + + def diff(*args): + a = get_curr() + b = 'now' + args = list( args ) + if args: + a = args.pop( 0 ) + if args: + b = args.pop( 0 ) + + curr_backup = curr_backup_new() + diff_inner( a, b, curr_backup ) + curr_backup.restore() + def fix_link(id): link = get_link( id ) e = empty.new() @@ -674,6 +742,7 @@ arg.cmd_new( 'next', comment='show next ids' ), arg.cmd_new( 'checkout', [ 'id' ], comment='alias is used instead of id' ), arg.cmd_new( 'check', comment='show dirty' ), + arg.cmd_new( 'diff' ), arg.cmd_new( 'fixlink', comment='fix link info' ), arg.cmd_new( 'push', [ 'to_path' ] ), arg.cmd_new( 'pull', [ 'from_path' ] ), @@ -687,8 +756,13 @@ if cmd.name == 'clone': clone( cmd, dir_path ) else: + add_rest = [ 'diff' ] + fsyn = fsyn_new( dir_path ) func = getattr( fsyn, cmd.name ) - func( *cmd.args ) + args = cmd.args + if cmd.name in add_rest: + args = args + cmd.a.get_av() + func( *args ) # EOF