view src/hgaction.h @ 605:ab92f695f776

Expand environmental parameters and executable name in action when it is received rather than when it's executed. This ensures we can correctly compare actions and fixes #141 "Unexpected error if you double-click on a toolbar button"
author Chris Cannam
date Tue, 03 Jul 2012 11:22:10 +0100
parents 012ba1b83328
children ae67ea0af696
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    EasyMercurial

    Based on HgExplorer by Jari Korhonen
    Copyright (c) 2010 Jari Korhonen
    Copyright (c) 2012 Chris Cannam
    Copyright (c) 2012 Queen Mary, University of London
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef HGACTION_H
#define HGACTION_H

#include <QString>
#include <QStringList>

enum HGACTIONS
{
    ACT_NONE,
    ACT_TEST_HG,
    ACT_TEST_HG_EXT,
    ACT_QUERY_PATHS,
    ACT_QUERY_BRANCH,
    ACT_STAT,
    ACT_RESOLVE_LIST,
    ACT_QUERY_HEADS,
    ACT_QUERY_HEADS_ACTIVE,
    ACT_QUERY_PARENTS,
    ACT_LOG,
    ACT_LOG_INCREMENTAL,
    ACT_REMOVE,
    ACT_ADD,
    ACT_INCOMING,
    ACT_PUSH,
    ACT_PULL,
    ACT_CLONEFROMREMOTE,
    ACT_INIT,
    ACT_COMMIT,
    ACT_CLOSE_BRANCH,
    ACT_ANNOTATE,
    ACT_UNCOMMITTED_SUMMARY,
    ACT_DIFF_SUMMARY,
    ACT_FOLDERDIFF,
    ACT_CHGSETDIFF,
    ACT_UPDATE,
    ACT_REVERT,
    ACT_MERGE,
    ACT_SERVE,
    ACT_RESOLVE_MARK,
    ACT_RETRY_MERGE,
    ACT_TAG,
    ACT_NEW_BRANCH,
    ACT_HG_IGNORE,
    ACT_COPY_FILE,
    ACT_RENAME_FILE
};

struct HgAction
{
    HGACTIONS action;
    QString workingDir;
    QStringList params;
    QString executable; // empty for normal Hg, but gets filled in by hgrunner
    void *extraData;

    HgAction() : action(ACT_NONE), extraData(0) { }

    HgAction(HGACTIONS _action, QString _wd, QStringList _params) :
        action(_action), workingDir(_wd), params(_params), extraData(0) { }

    HgAction(HGACTIONS _action, QString _wd, QStringList _params, void *_d) :
        action(_action), workingDir(_wd), params(_params), extraData(_d) { }

    bool operator==(const HgAction &a) {
        bool equal = (a.action == action && a.workingDir == workingDir &&
                      a.params == params && a.executable == executable &&
                      a.extraData == extraData);
        return equal;
    }

    bool shouldBeFast() const {
        switch (action) {
        case ACT_NONE:
        case ACT_TEST_HG:
        case ACT_TEST_HG_EXT:
        case ACT_QUERY_PATHS:
        case ACT_QUERY_BRANCH:
        case ACT_STAT:
        case ACT_RESOLVE_LIST:
        case ACT_QUERY_HEADS:
        case ACT_QUERY_HEADS_ACTIVE:
        case ACT_QUERY_PARENTS:
        case ACT_LOG_INCREMENTAL:
            return true;
        default:
            return false;
        }
    }
    
    bool mayBeInteractive() const {
	switch (action) {
        case ACT_TEST_HG_EXT: // so we force the module load to be tested
	case ACT_INCOMING:
	case ACT_PUSH:
	case ACT_PULL:
	case ACT_CLONEFROMREMOTE:
	case ACT_FOLDERDIFF:
	case ACT_CHGSETDIFF:
	case ACT_SERVE:
	    return true;
	default:
	    return false;
	}
    }

    bool makesSenseToCancel() const {
        switch (action) {
        case ACT_INCOMING:
        case ACT_PUSH:
        case ACT_PULL:
        case ACT_CLONEFROMREMOTE:
        case ACT_FOLDERDIFF:
        case ACT_CHGSETDIFF:
            return true;
        default:
            return false;
        }
    }
};

#endif