1 #include "projecttake.h"
3 #include "motorproject.h"
5 projecttake::projecttake() {
8 projecttake::projecttake(const string
&definition
) {
15 token
= getword(buf
= definition
);
16 if(token
!= "take") buf
= definition
;
18 if(!regcomp(&r
, "^\"(.+)\" to (.+) from (.+)$", REG_EXTENDED
)) {
19 if(rdone
= !regexec(&r
, buf
.c_str(), 4, rm
, 0)) kind
= text
;
23 if(!rdone
&& !regcomp(&r
, "^(.+) to (.+) from (.+)$", REG_EXTENDED
)) {
24 if(rdone
= !regexec(&r
, buf
.c_str(), 4, rm
, 0)) kind
= folder
;
28 if(!rdone
|| (rm
[3].rm_so
== -1)) throw (0);
30 placefrom
= buf
.substr(rm
[1].rm_so
, rm
[1].rm_eo
-rm
[1].rm_so
);
31 placeto
= buf
.substr(rm
[2].rm_so
, rm
[2].rm_eo
-rm
[2].rm_so
);
32 sourcetemplate
= buf
.substr(rm
[3].rm_so
, rm
[3].rm_eo
-rm
[3].rm_so
);
35 projecttake::~projecttake() {
38 void projecttake::exec(const string
&pname
) {
39 vector
<motorfolder
>::iterator ifold
, ffold
;
40 vector
<motorfile
>::iterator ifile
;
44 if(!(mp
= motorproject(pname
)).empty()) {
47 if((ifold
= find(project
.foldbegin(), project
.foldend(), placeto
))
49 ifold
->addfile(motorfile(getparsed(mp
, placefrom
)));
51 } else if(kind
== folder
) {
53 if((ifold
= find(project
.foldbegin(), project
.foldend(), placeto
)) != project
.foldend())
54 if((ffold
= find(mp
.foldbegin(), mp
.foldend(), placefrom
)) != mp
.foldend()) {
55 for(ifile
= ffold
->begin(); ifile
!= ffold
->end(); ifile
++) {
56 fname
= mp
.transformfname(projectpaths::absolute
, ifile
->getfname());
57 ifold
->addfile(fname
);
67 void projecttake::undo(const string
&pname
) {
68 vector
<motorfolder
>::iterator ifold
, ffold
;
69 vector
<motorfile
>::iterator ifile
, ef
;
73 if(!(mp
= motorproject(pname
)).empty()) {
76 if((ifold
= find(project
.foldbegin(), project
.foldend(), placeto
)) != project
.foldend())
77 if((ifile
= find(ifold
->begin(), ifold
->end(), getparsed(mp
, placefrom
))) != ifold
->end())
78 ifold
->removefile(*ifile
);
80 } else if(kind
== folder
) {
82 if((ifold
= find(project
.foldbegin(), project
.foldend(), placeto
)) != project
.foldend())
83 if((ffold
= find(mp
.foldbegin(), mp
.foldend(), placefrom
)) != mp
.foldend()) {
84 for(ifile
= ffold
->begin(); ifile
!= ffold
->end(); ifile
++)
85 if((ef
= find(ifold
->begin(), ifold
->end(), ifile
->getfname())) != ifold
->end()) {
86 fname
= mp
.transformfname(projectpaths::absolute
, ef
->getfname());
87 ifold
->removefile(fname
);
97 string
projecttake::getsourcetemplate() {
98 return sourcetemplate
;