/* -*-Mode: C++;-*-
* PRCS - The Project Revision Control System
* Copyright (C) 1997 Josh MacDonald
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: prcsver.cc 1.2.1.11.3.7 Tue, 05 Feb 2002 11:49:08 -0800 jmacd $
*/
#include "prcs.h"
#include "projdesc.h"
#include "vc.h"
#include "misc.h"
#include "repository.h"
PrProjectVersionDataPtrError resolve_version(const char* maj,
const char* min,
const char* project_full_name,
const char* project_file_path,
ProjectDescriptor* project /* or null */,
RepEntry* rep_entry)
{
ProjectDescriptor* local_project = project;
ProjectVersionData* local_project_data = NULL;
ProjectVersionData* new_project_data = NULL;
Dstring new_major_version;
Dstring new_minor_version;
if(!maj[0] || !min[0]) {
/* caller doesn't have a project descriptor and we need one */
if(!local_project) {
If_fail(local_project << read_project_file(project_full_name,
project_file_path,
true,
KeepNothing))
pthrow prcserror << "Failed reading project file, can't resolve null version"
<< dotendl;
}
local_project_data = rep_entry->lookup_version(local_project);
if(!local_project_data)
pthrow prcserror << "Project version in working project file "
<< local_project->full_version()
<< " does not exist, cannot resolve null version" << dotendl;
}
if(!maj[0]) {
new_major_version.assign(local_project_data->prcs_major());
} else if(strcmp(maj, "@") == 0) {
int highest_major;
if(rep_entry->version_count() == 0)
pthrow prcserror << "No versions in the repository, can't "
"resolve major version '@'" << dotendl;
highest_major = rep_entry->highest_major_version();
if(highest_major >= 0) {
new_major_version.assign_int(highest_major);
} else
pthrow prcserror << "No numeric major versions in the repository, "
"can't resolve major version '@'" << dotendl;
} else {
new_major_version.assign(maj);
}
if(!min[0]) {
/* Assumption: if min is null then so is maj, as enforced in prcs.cc */
new_minor_version.assign(local_project_data->prcs_minor());
} else if(strcmp(min, "@") == 0) {
/* Highest_minor_version returns 0 if no major is found */
new_minor_version.assign_int(rep_entry->highest_minor_version(new_major_version, false));
} else {
new_minor_version.assign(min);
}
if(!project && local_project)
delete local_project;
new_project_data = rep_entry->lookup_version(new_major_version, new_minor_version);
if(strcmp(new_minor_version, "0") != 0 && !new_project_data) {
/* its not an empty version and we didn't find it in the repository */
pthrow prcserror << "Could not resolve version " << maj << "." << min << dotendl;
}
if(new_project_data) {
if(new_project_data->deleted())
pthrow prcserror << "Project version " << new_project_data << " has been deleted" << dotendl;
return new_project_data;
} else {
pthrow prcserror << "No such version: " << maj << '.' << min << dotendl;
}
}
syntax highlighted by Code2HTML, v. 0.9.1