def parseoptions(ui, cmdoptions, args): cmdoptions = list(cmdoptions) opts = {} args = list(args) while True: try: args = fancyopts.fancyopts(list(args), cmdoptions, opts, True) break except getopt.GetoptError as ex: flag = None if "requires argument" in ex.msg: raise if ('--' + ex.opt) in ex.msg: flag = '--' + ex.opt elif ('-' + ex.opt) in ex.msg: flag = '-' + ex.opt else: raise GitUnknownError(ui, "unknown option %s" % ex.opt) try: args.remove(flag) except Exception: raise GitUnknownError(ui, "unknown option {0} packed with other options\n" "Please try passing the option as it's own flag: -{0}" \ .format(ex.opt)) ui.warn(_("ignoring unknown option %s\n") % flag) args = list([convert(x) for x in args]) opts = dict([(k, convert(v)) if isinstance(v, str) else (k, v) for k, v in opts.iteritems()]) return args, opts
def parseoptions(ui, cmdoptions, args): cmdoptions = list(cmdoptions) opts = {} args = list(args) while True: try: args = fancyopts.fancyopts(list(args), cmdoptions, opts, True) break except getopt.GetoptError as ex: flag = None if "requires argument" in ex.msg: raise if ('--' + ex.opt) in ex.msg: flag = '--' + ex.opt elif ('-' + ex.opt) in ex.msg: flag = '-' + ex.opt else: raise error.Abort(_("unknown option %s") % ex.opt) try: args.remove(flag) except Exception: msg = _("unknown option '%s' packed with other options") hint = _("please try passing the option as its own flag: -%s") raise error.Abort(msg % ex.opt, hint=hint % ex.opt) ui.warn(_("ignoring unknown option %s\n") % flag) args = list([convert(x) for x in args]) opts = dict([(k, convert(v)) if isinstance(v, str) else (k, v) for k, v in opts.iteritems()]) return args, opts
def _parse(ui, args): options = {} cmdoptions = {} try: args = fancyopts.fancyopts(args, globalopts, options) except fancyopts.getopt.GetoptError, inst: raise error.CommandError(None, inst)
def dispatch_(im, args, opts): def complete(s, choices): candidates = [] for choice in choices: if choice.startswith(s): candidates.append(choice) return candidates c, args = args[0], list(args[1:]) cmd = complete(c, subcmdtable.keys()) if not cmd: raise cmdutil.UnknownCommand('imerge ' + c) if len(cmd) > 1: cmd.sort() raise cmdutil.AmbiguousCommand('imerge ' + c, cmd) cmd = cmd[0] func, optlist = subcmdtable[cmd] opts = {} try: args = fancyopts.fancyopts(args, optlist, opts) return func(im, *args, **opts) except fancyopts.getopt.GetoptError, inst: raise dispatch.ParseError('imerge', '%s: %s' % (cmd, inst))
os.unlink(repo.join(shelfpath)) except OSError, err: ui.warn("restoring backup failed: %s\n" % err) return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug('removing backup for %r : %r\n' % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError, err: ui.warn("removing backup failed: %s\n" % err) fancyopts.fancyopts([], commands.commitopts, opts) # wrap ui.write so diff output can be labeled/colorized def wrapwrite(orig, *args, **kw): label = kw.pop('label', '') if label: label += ' ' for chunk, l in patch.difflabel(lambda: args): orig(chunk, label=label + l) oldwrite = ui.write extensions.wrapfunction(ui, 'write', wrapwrite) try: return cmdutil.commit(ui, repo, shelvefunc, pats, opts) finally: ui.write = oldwrite
else: alias, args = 'workbench', [] aliases, i = cmdutil.findcmd(alias, table, ui.config("ui", "strict")) for a in aliases: if a.startswith(alias): alias = a break cmd = aliases[0] c = list(i[1]) # combine global options into local for o in globalopts: c.append((o[0], o[1], options[o[1]], o[3])) try: args = fancyopts.fancyopts(args, c, cmdoptions) except fancyopts.getopt.GetoptError, inst: raise error.CommandError(cmd, inst) # separate global options back out for o in globalopts: n = o[1] options[n] = cmdoptions[n] del cmdoptions[n] listfile = options.get('listfile') if listfile: del options['listfile'] get_lines_from_listfile(listfile, False) listfileutf8 = options.get('listfileutf8') if listfileutf8:
def get_initial_opts(): initial_opts = {} fancyopts.fancyopts([], cmdtable['postreview'][1], initial_opts) return initial_opts
def interactiveshelve(ui, repo, name, pats, opts): """interactively select changes to set aside""" if not ui.interactive: raise util.Abort( _('shelve --interactive can only be run interactively')) try: record = extensions.find('record') except KeyError: raise util.Abort(_("'record' extension not loaded")) # monkeypatch record extension record.hunk.__eq__ = hunk__eq__ def shelvefunc(ui, repo, message, match, opts): files = [] if match.files(): changes = None else: changes = repo.status(match=match)[:3] modified, added, removed = changes files = modified + added + removed match = cmdutil.matchfiles(repo, files) diffopts = repo.attic.diffopts({'git': True, 'nodates': True}) chunks = patch.diff(repo, repo.dirstate.parents()[0], match=match, changes=changes, opts=diffopts) fp = cStringIO.StringIO() fp.write(''.join(chunks)) fp.seek(0) # 1. filter patch, so we have intending-to apply subset of it ac = record.parsepatch(fp) chunks = record.filterpatch(ui, ac) # and a not-intending-to apply subset of it rc = refilterpatch(ac, chunks) del fp contenders = {} for h in chunks: try: contenders.update(dict.fromkeys(h.files())) except AttributeError: pass newfiles = [f for f in files if f in contenders] if not newfiles: ui.status(_('no changes to shelve\n')) return 0 modified = dict.fromkeys(changes[0]) backups = {} backupdir = repo.join('shelve-backups') try: bkfiles = [f for f in newfiles if f in modified] backups = makebackup(ui, repo, backupdir, bkfiles) # patch to shelve sp = cStringIO.StringIO() for c in chunks: if c.filename() in backups: c.write(sp) doshelve = sp.tell() sp.seek(0) # patch to apply to shelved files fp = cStringIO.StringIO() for c in rc: if c.filename() in backups: c.write(fp) dopatch = fp.tell() fp.seek(0) try: # 3a. apply filtered patch to clean repo (clean) if backups: hg.revert(repo, repo.dirstate.parents()[0], backups.has_key) # 3b. apply filtered patch to clean repo (apply) if dopatch: ui.debug(_('applying patch\n')) ui.debug(fp.getvalue()) patch.internalpatch(fp, ui, 1, repo.root) del fp # 3c. apply filtered patch to clean repo (shelve) if doshelve: ui.debug(_("saving patch to %s\n") % (name)) s = repo.attic f = s.opener(name, 'w') f.write(sp.getvalue()) del f s.currentpatch = name s.persiststate() del sp except: try: for realname, tmpname in backups.iteritems(): ui.debug( _('restoring %r to %r\n') % (tmpname, realname)) util.copyfile(tmpname, repo.wjoin(realname)) except OSError: pass return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug( _('removing backup for %r : %r\n') % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError: pass fancyopts.fancyopts([], commands.commitopts, opts) return cmdutil.commit(ui, repo, shelvefunc, pats, opts)
def shelve(ui, repo, *pats, **opts): '''interactively select changes to set aside If a list of files is omitted, all changes reported by "hg status" will be candidates for shelving. You will be prompted for whether to shelve changes to each modified file, and for files with multiple changes, for each change to use. The shelve command works with the Color extension to display diffs in color. On each prompt, the following responses are possible: y - shelve this change n - skip this change s - skip remaining changes to this file f - shelve remaining changes to this file d - done, skip remaining changes and files a - shelve all changes to all remaining files q - quit, shelving no changes ? - display help''' if not ui.interactive: raise util.Abort(_('shelve can only be run interactively')) # List all the active shelves by name and return ' if opts['list']: listshelves(ui,repo) return forced = opts['force'] or opts['append'] # Shelf name and path shelfname = opts.get('name') shelfpath = getshelfpath(repo, shelfname) if os.path.exists(repo.join(shelfpath)) and not forced: raise util.Abort(_('shelve data already exists')) def shelvefunc(ui, repo, message, match, opts): changes = repo.status(match=match)[:5] modified, added, removed = changes[:3] files = modified + added + removed diffopts = mdiff.diffopts(git=True, nodates=True) patch_diff = ''.join(patch.diff(repo, repo.dirstate.parents()[0], match=match, changes=changes, opts=diffopts)) fp = cStringIO.StringIO(patch_diff) ac = parsepatch(fp) fp.close() chunks = filterpatch(ui, ac, not opts['all']) rc = refilterpatch(ac, chunks) contenders = {} for h in chunks: try: contenders.update(dict.fromkeys(h.files())) except AttributeError: pass newfiles = [f for f in files if f in contenders] if not newfiles: ui.status(_('no changes to shelve\n')) return 0 modified = dict.fromkeys(changes[0]) backupdir = repo.join('shelve-backups') try: bkfiles = [f for f in newfiles if f in modified] backups = makebackup(ui, repo, backupdir, bkfiles) # patch to shelve sp = cStringIO.StringIO() for c in chunks: if c.filename() in backups: c.write(sp) doshelve = sp.tell() sp.seek(0) # patch to apply to shelved files fp = cStringIO.StringIO() for c in rc: if c.filename() in backups: c.write(fp) dopatch = fp.tell() fp.seek(0) try: # 3a. apply filtered patch to clean repo (clean) if backups: hg.revert(repo, repo.dirstate.parents()[0], backups.has_key) # 3b. apply filtered patch to clean repo (apply) if dopatch: ui.debug('applying patch\n') ui.debug(fp.getvalue()) patch.internalpatch(fp, ui, 1, repo.root) del fp # 3c. apply filtered patch to clean repo (shelve) if doshelve: ui.debug("saving patch to shelve\n") if opts['append']: f = repo.opener(shelfpath, "a") else: f = repo.opener(shelfpath, "w") f.write(sp.getvalue()) del f del sp except: try: for realname, tmpname in backups.iteritems(): ui.debug('restoring %r to %r\n' % (tmpname, realname)) util.copyfile(tmpname, repo.wjoin(realname)) ui.debug('removing shelve file\n') os.unlink(repo.join(shelfpath)) except OSError: pass return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug('removing backup for %r : %r\n' % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError: pass fancyopts.fancyopts([], commands.commitopts, opts) return cmdutil.commit(ui, repo, shelvefunc, pats, opts)
if os.path.isfile(repo.wjoin(shelfpath)): os.unlink(repo.join(shelfpath)) except OSError, err: ui.warn("restoring backup failed: %s\n" % err) return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug("removing backup for %r : %r\n" % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError, err: ui.warn("removing backup failed: %s\n" % err) fancyopts.fancyopts([], commands.commitopts, opts) # wrap ui.write so diff output can be labeled/colorized def wrapwrite(orig, *args, **kw): label = kw.pop("label", "") if label: label += " " for chunk, l in patch.difflabel(lambda: args): orig(chunk, label=label + l) oldwrite = ui.write extensions.wrapfunction(ui, "write", wrapwrite) try: return cmdutil.commit(ui, repo, shelvefunc, pats, opts) finally: ui.write = oldwrite
def shelve(ui, repo, *pats, **opts): '''interactively select changes to set aside If a list of files is omitted, all changes reported by "hg status" will be candidates for shelving. You will be prompted for whether to shelve changes to each modified file, and for files with multiple changes, for each change to use. The shelve command works with the Color extension to display diffs in color. On each prompt, the following responses are possible:: y - shelve this change n - skip this change s - skip remaining changes to this file f - shelve remaining changes to this file d - done, skip remaining changes and files a - shelve all changes to all remaining files q - quit, shelving no changes ? - display help''' if not ui.interactive: raise util.Abort(_('shelve can only be run interactively')) # List all the active shelves by name and return ' if opts['list']: listshelves(ui, repo) return forced = opts['force'] or opts['append'] # Shelf name and path shelfname = opts.get('name') shelfpath = getshelfpath(repo, shelfname) if os.path.exists(repo.join(shelfpath)) and not forced: raise util.Abort(_('shelve data already exists')) def shelvefunc(ui, repo, message, match, opts): changes = repo.status(match=match)[:5] modified, added, removed = changes[:3] files = modified + added + removed diffopts = mdiff.diffopts(git=True, nodates=True) patch_diff = ''.join( patch.diff(repo, repo.dirstate.parents()[0], match=match, changes=changes, opts=diffopts)) fp = cStringIO.StringIO(patch_diff) ac = parsepatch(fp) fp.close() chunks = filterpatch(ui, ac, not opts['all']) rc = refilterpatch(ac, chunks) contenders = {} for h in chunks: try: contenders.update(dict.fromkeys(h.files())) except AttributeError: pass newfiles = [f for f in files if f in contenders] if not newfiles: ui.status(_('no changes to shelve\n')) return 0 modified = dict.fromkeys(changes[0]) backupdir = repo.join('shelve-backups') try: bkfiles = [f for f in newfiles if f in modified] backups = makebackup(ui, repo, backupdir, bkfiles) # patch to shelve sp = cStringIO.StringIO() for c in chunks: if c.filename() in backups: c.write(sp) doshelve = sp.tell() sp.seek(0) # patch to apply to shelved files fp = cStringIO.StringIO() for c in rc: if c.filename() in backups: c.write(fp) dopatch = fp.tell() fp.seek(0) try: # 3a. apply filtered patch to clean repo (clean) if backups: hg.revert(repo, repo.dirstate.parents()[0], backups.has_key) # 3b. apply filtered patch to clean repo (apply) if dopatch: ui.debug('applying patch\n') ui.debug(fp.getvalue()) patch.internalpatch(fp, ui, 1, repo.root) del fp # 3c. apply filtered patch to clean repo (shelve) if doshelve: ui.debug("saving patch to shelve\n") if opts['append']: f = repo.opener(shelfpath, "a") else: f = repo.opener(shelfpath, "w") f.write(sp.getvalue()) del f del sp except: try: for realname, tmpname in backups.iteritems(): ui.debug('restoring %r to %r\n' % (tmpname, realname)) util.copyfile(tmpname, repo.wjoin(realname)) ui.debug('removing shelve file\n') os.unlink(repo.join(shelfpath)) except OSError: pass return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug('removing backup for %r : %r\n' % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError: pass fancyopts.fancyopts([], commands.commitopts, opts) return cmdutil.commit(ui, repo, shelvefunc, pats, opts) # wrap ui.write so diff output can be labeled/colorized def wrapwrite(orig, *args, **kw): label = kw.pop('label', '') for chunk, l in patch.difflabel(lambda: args): orig(chunk, label=label + l) oldwrite = ui.write extensions.wrapfunction(ui, 'write', wrapwrite) try: return cmdutil.commit(ui, repo, shelvefunc, pats, opts) finally: ui.write = oldwrite
def interactiveshelve(ui, repo, name, pats, opts): """interactively select changes to set aside""" if not ui.interactive: raise util.Abort(_('shelve --interactive can only be run interactively')) try: record = extensions.find('record') except KeyError: raise util.Abort(_("'record' extension not loaded")) # monkeypatch record extension record.hunk.__eq__ = hunk__eq__ def shelvefunc(ui, repo, message, match, opts): files = [] if match.files(): changes = None else: changes = repo.status(match = match)[:3] modified, added, removed = changes files = modified + added + removed match = cmdutil.matchfiles(repo, files) diffopts = repo.attic.diffopts( {'git':True, 'nodates':True}) chunks = patch.diff(repo, repo.dirstate.parents()[0], match = match, changes = changes, opts = diffopts) fp = cStringIO.StringIO() fp.write(''.join(chunks)) fp.seek(0) # 1. filter patch, so we have intending-to apply subset of it ac = record.parsepatch(fp) chunks = record.filterpatch(ui, ac) # and a not-intending-to apply subset of it rc = refilterpatch(ac, chunks) del fp contenders = {} for h in chunks: try: contenders.update(dict.fromkeys(h.files())) except AttributeError: pass newfiles = [f for f in files if f in contenders] if not newfiles: ui.status(_('no changes to shelve\n')) return 0 modified = dict.fromkeys(changes[0]) backups = {} backupdir = repo.join('shelve-backups') try: bkfiles = [f for f in newfiles if f in modified] backups = makebackup(ui, repo, backupdir, bkfiles) # patch to shelve sp = cStringIO.StringIO() for c in chunks: if c.filename() in backups: c.write(sp) doshelve = sp.tell() sp.seek(0) # patch to apply to shelved files fp = cStringIO.StringIO() for c in rc: if c.filename() in backups: c.write(fp) dopatch = fp.tell() fp.seek(0) try: # 3a. apply filtered patch to clean repo (clean) if backups: hg.revert(repo, repo.dirstate.parents()[0], backups.has_key) # 3b. apply filtered patch to clean repo (apply) if dopatch: ui.debug(_('applying patch\n')) ui.debug(fp.getvalue()) patch.internalpatch(fp, ui, 1, repo.root) del fp # 3c. apply filtered patch to clean repo (shelve) if doshelve: ui.debug(_("saving patch to %s\n") % (name)) s = repo.attic f = s.opener(name, 'w') f.write(sp.getvalue()) del f s.currentpatch = name s.persiststate() del sp except: try: for realname, tmpname in backups.iteritems(): ui.debug(_('restoring %r to %r\n') % (tmpname, realname)) util.copyfile(tmpname, repo.wjoin(realname)) except OSError: pass return 0 finally: try: for realname, tmpname in backups.iteritems(): ui.debug(_('removing backup for %r : %r\n') % (realname, tmpname)) os.unlink(tmpname) os.rmdir(backupdir) except OSError: pass fancyopts.fancyopts([], commands.commitopts, opts) return cmdutil.commit(ui, repo, shelvefunc, pats, opts)
else: alias, args = 'workbench', [] aliases, i = cmdutil.findcmd(alias, table, ui.config("ui", "strict")) for a in aliases: if a.startswith(alias): alias = a break cmd = aliases[0] c = list(i[1]) # combine global options into local for o in globalopts: c.append((o[0], o[1], options[o[1]], o[3])) try: args = fancyopts.fancyopts(args, c, cmdoptions, True) except fancyopts.getopt.GetoptError, inst: raise error.CommandError(cmd, inst) # separate global options back out for o in globalopts: n = o[1] options[n] = cmdoptions[n] del cmdoptions[n] listfile = options.get('listfile') if listfile: del options['listfile'] get_lines_from_listfile(listfile, False) listfileutf8 = options.get('listfileutf8') if listfileutf8:
def redo(ui, repo, *args, **opts): """ perform a redo Rolls back the previous undo. """ shiftedindex = _computerelative(repo, 0) preview = opts.get("preview") branch = "" reverseindex = 0 redocount = 0 done = False while not done: # we step back the linear undo log # redoes cancel out undoes, if we have one more undo, we should undo # there, otherwise we continue looking # we are careful to not redo past absolute undoes (bc we loose undoredo # log info) # if we run into something that isn't undo or redo, we Abort (including # gaps in the log) # we extract the --index arguments out of undoes to make sure we update # the undoredo index correctly nodedict = _readindex(repo, reverseindex) commandstr = _readnode(repo, 'command.i', nodedict['command']) commandlist = commandstr.split("\0") if 'True' == nodedict['unfinished']: # don't want to redo to an interupted state reverseindex += 1 elif commandlist[0] == "undo": undoopts = {} fancyopts.fancyopts(commandlist, cmdtable['undo'][1] + commands.globalopts, undoopts, gnu=True) if redocount == 0: # want to go to state before the undo (not after) toshift = undoopts['step'] shiftedindex -= toshift reverseindex += 1 branch = undoopts.get('branch') done = True else: if undoopts['absolute']: raise error.Abort(_("can't redo past absolute undo")) reverseindex += 1 redocount -= 1 elif commandlist[0] == "redo": redocount += 1 reverseindex += 1 else: raise error.Abort(_("nothing to redo")) if preview: _preview(ui, repo, reverseindex) return with repo.wlock(), repo.lock(), repo.transaction("redo"): cmdutil.checkunfinished(repo) cmdutil.bailifchanged(repo) repo = repo.unfiltered() _undoto(ui, repo, reverseindex) # update undredo by removing what the given undo added _logundoredoindex(repo, shiftedindex, branch)
def test_update(): opts = {} args = fancyopts.fancyopts(['-u'], cmdtable['postreview'][1], opts, True) eq_(True, opts['update'])
def test_existing(): opts = {} fancyopts.fancyopts(['-e', '101'], cmdtable['postreview'][1], opts, True) eq_('101', opts['existing'])
def test_repoid(): opts = {} args = fancyopts.fancyopts(['-i', '101'], cmdtable['postreview'][1], opts, True) eq_('101', opts['repoid'])
def test_target_people(): opts = {} args = fancyopts.fancyopts(['-U', 'john, jane'], cmdtable['postreview'][1], opts, True) eq_('john, jane', opts['target_people'])
def test_target_groups(): opts = {} args = fancyopts.fancyopts(['-G', 'foo, bar'], cmdtable['postreview'][1], opts, True) eq_('foo, bar', opts['target_groups'])