diff --git a/source/app.d b/source/app.d index f7d77ee..0a7b291 100644 --- a/source/app.d +++ b/source/app.d @@ -133,11 +133,11 @@ return 0; case "install": enforce(args.length >= 2, "Missing package name."); - auto location = InstallLocation.UserWide; + auto location = InstallLocation.userWide; auto name = args[1]; enforce(!install_local || !install_system, "Cannot install locally and system wide at the same time."); - if( install_local ) location = InstallLocation.Local; - else if( install_system ) location = InstallLocation.SystemWide; + if( install_local ) location = InstallLocation.local; + else if( install_system ) location = InstallLocation.systemWide; if( install_version.length ) dub.install(name, new Dependency(install_version), location); else { try dub.install(name, new Dependency(">=0.0.0"), location); @@ -150,11 +150,11 @@ break; case "uninstall": enforce(args.length >= 2, "Missing package name."); - /*auto location = InstallLocation.UserWide; + /*auto location = InstallLocation.userWide; auto name = args[1]; enforce(!install_local || !install_system, "Cannot install locally and system wide at the same time."); - if( install_local ) location = InstallLocation.Local; - else if( install_system ) location = InstallLocation.SystemWide; + if( install_local ) location = InstallLocation.local; + else if( install_system ) location = InstallLocation.systemWide; if( install_version.length ) dub.uninstall(name, new Dependency(install_version), location); else { assert(false); @@ -172,7 +172,7 @@ case "list-locals": logInfo("Locals:"); foreach( p; dub.packageManager.getPackageIterator() ) - if( p.installLocation == InstallLocation.Local ) + if( p.installLocation == InstallLocation.local ) logInfo(" %s %s: %s", p.name, p.ver, p.path.toNativeString()); logInfo(""); break; diff --git a/source/dub/dub.d b/source/dub/dub.d index 52e71ff..db2858e 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -117,7 +117,7 @@ logInfo("The following changes could be performed:"); bool conflictedOrFailed = false; foreach(Action a; actions) { - logInfo(capitalize(to!string(a.type)) ~ ": " ~ a.packageId ~ ", version %s", a.vers); + logInfo("%s %s %s, %s", capitalize(to!string(a.type)), a.packageId, a.vers, a.location); if( a.type == Action.Type.conflict || a.type == Action.Type.failure ) { logInfo("Issued by: "); conflictedOrFailed = true; @@ -182,11 +182,17 @@ /// Installs the package matching the dependency into the application. /// @param addToApplication if true, this will also add an entry in the /// list of dependencies in the application's package.json - void install(string packageId, const Dependency dep, InstallLocation location = InstallLocation.ProjectLocal) + void install(string packageId, const Dependency dep, InstallLocation location = InstallLocation.projectLocal) { auto pinfo = m_packageSupplier.packageJson(packageId, dep); string ver = pinfo["version"].get!string; + if( m_packageManager.hasPackage(packageId, ver, location) ){ + logInfo("Package %s %s (%s) is already installed with the latest version, skipping upgrade.", + packageId, ver, location); + return; + } + logInfo("Downloading %s %s...", packageId, ver); logDebug("Acquiring package zip file"); diff --git a/source/dub/package_.d b/source/dub/package_.d index d09b7c8..92e359c 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -25,10 +25,10 @@ /// Indicates where a package has been or should be installed to. enum InstallLocation { - Local, - ProjectLocal, - UserWide, - SystemWide + local, + projectLocal, + userWide, + systemWide } /// Representing an installed package, usually constructed from a json object. @@ -83,7 +83,7 @@ this(jsonFromFile(root ~ PackageJsonFilename), location, root); } - this(Json packageInfo, InstallLocation location = InstallLocation.Local, Path root = Path()) + this(Json packageInfo, InstallLocation location = InstallLocation.local, Path root = Path()) { m_location = location; m_path = root; diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index cba794f..535c519 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -66,6 +66,15 @@ return null; } + bool hasPackage(string name, string ver, InstallLocation location) + { + foreach(ep; getPackageIterator()){ + if( ep.installLocation == location && ep.name == name && ep.vers == ver ) + return true; + } + return false; + } + Package getBestPackage(string name, string version_spec) { return getBestPackage(name, new Dependency(version_spec)); @@ -157,25 +166,15 @@ Package install(Path zip_file_path, Json package_info, InstallLocation location) { - foreach(ep; getPackageIterator()){ - if( ep.installLocation == location && ep.name == package_info.name.get!string - && ep.vers == package_info["version"].get!string() ) - { - logInfo("Skipping installation of already existing %s package %s %s.", - location, ep.name, ep.vers); - return ep; - } - } - auto package_name = package_info.name.get!string(); auto package_version = package_info["version"].get!string(); Path destination; final switch( location ){ - case InstallLocation.Local: destination = Path(package_name); break; - case InstallLocation.ProjectLocal: enforce(!m_projectPackagePath.empty, "no project path set."); destination = m_projectPackagePath ~ package_name; break; - case InstallLocation.UserWide: destination = m_userPackagePath ~ (package_name ~ "/" ~ package_version); break; - case InstallLocation.SystemWide: destination = m_systemPackagePath ~ (package_name ~ "/" ~ package_version); break; + case InstallLocation.local: destination = Path(package_name); break; + case InstallLocation.projectLocal: enforce(!m_projectPackagePath.empty, "no project path set."); destination = m_projectPackagePath ~ package_name; break; + case InstallLocation.userWide: destination = m_userPackagePath ~ (package_name ~ "/" ~ package_version); break; + case InstallLocation.systemWide: destination = m_systemPackagePath ~ (package_name ~ "/" ~ package_version); break; } if( existsFile(destination) ){ @@ -254,10 +253,10 @@ auto pack = new Package(location, destination); final switch( location ){ - case InstallLocation.Local: break; - case InstallLocation.ProjectLocal: m_projectPackages[package_name] = pack; break; - case InstallLocation.UserWide: m_userPackages[package_name] ~= pack; break; - case InstallLocation.SystemWide: m_systemPackages[package_name] ~= pack; break; + case InstallLocation.local: break; + case InstallLocation.projectLocal: m_projectPackages[package_name] = pack; break; + case InstallLocation.userWide: m_userPackages[package_name] ~= pack; break; + case InstallLocation.systemWide: m_systemPackages[package_name] ~= pack; break; } return pack; } @@ -268,21 +267,21 @@ // remove package from package list final switch(pack.installLocation){ - case InstallLocation.Local: assert(false, "Cannot uninstall locally installed package."); - case InstallLocation.ProjectLocal: + case InstallLocation.local: assert(false, "Cannot uninstall locally installed package."); + case InstallLocation.projectLocal: auto pp = pack.name in m_projectPackages; assert(pp !is null, "Package "~pack.name~" at "~pack.path.toNativeString()~" is not installed in project."); assert(*pp is pack); m_projectPackages.remove(pack.name); break; - case InstallLocation.UserWide: + case InstallLocation.userWide: auto pv = pack.name in m_systemPackages; assert(pv !is null, "Package "~pack.name~" at "~pack.path.toNativeString()~" is not installed in user repository."); auto idx = countUntil(*pv, pack); assert(idx < 0 || (*pv)[idx] is pack); if( idx >= 0 ) *pv = (*pv)[0 .. idx] ~ (*pv)[idx+1 .. $]; break; - case InstallLocation.SystemWide: + case InstallLocation.systemWide: auto pv = pack.name in m_userPackages; assert(pv !is null, "Package "~pack.name~" at "~pack.path.toNativeString()~" is not installed system repository."); auto idx = countUntil(*pv, pack); @@ -347,7 +346,7 @@ } } - *packs ~= new Package(info, InstallLocation.Local, path); + *packs ~= new Package(info, InstallLocation.local, path); writeLocalPackageList(type); } @@ -396,8 +395,8 @@ catch(Exception e) logDebug("Failed to enumerate %s packages: %s", location, e.toString()); } } - scanPackageFolder(m_systemPackagePath, m_systemPackages, InstallLocation.SystemWide); - scanPackageFolder(m_userPackagePath, m_userPackages, InstallLocation.UserWide); + scanPackageFolder(m_systemPackagePath, m_systemPackages, InstallLocation.systemWide); + scanPackageFolder(m_userPackagePath, m_userPackages, InstallLocation.userWide); // rescan the project package folder @@ -410,7 +409,7 @@ if( !existsFile(pack_path ~ PackageJsonFilename) ) continue; try { - auto p = new Package(InstallLocation.ProjectLocal, pack_path); + auto p = new Package(InstallLocation.projectLocal, pack_path); m_projectPackages[pdir.name] = p; } catch( Exception e ){ logError("Failed to load package in %s: %s", pack_path, e.msg); @@ -438,7 +437,7 @@ logWarn("Local package at %s has different name than %s (%s)", path.toNativeString(), name, info.name.get!string()); info.name = name; info["version"] = ver; - auto pp = new Package(info, InstallLocation.Local, path); + auto pp = new Package(info, InstallLocation.local, path); packs ~= pp; } catch( Exception e ){ logWarn("Error adding local package: %s", e.msg); diff --git a/source/dub/project.d b/source/dub/project.d index 52d61df..7152cd0 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -114,11 +114,11 @@ logWarn("There was no '"~PackageJsonFilename~"' found for the application in '%s'.", m_root.toNativeString()); auto json = Json.EmptyObject; json.name = ""; - m_main = new Package(json, InstallLocation.Local, m_root); + m_main = new Package(json, InstallLocation.local, m_root); return; } - m_main = new Package(InstallLocation.Local, m_root); + m_main = new Package(InstallLocation.local, m_root); // TODO: compute the set of mutual dependencies first // (i.e. ">=0.0.1 <=0.0.5" and "<= 0.0.4" get ">=0.0.1 <=0.0.4") @@ -241,14 +241,14 @@ if(!p || (!d.dependency.matches(p.vers) && !d.dependency.matches(Version.MASTER))) { if(!p) logDebug("Application not complete, required package '"~pkg~"', which was not found."); else logDebug("Application not complete, required package '"~pkg~"', invalid version. Required '%s', available '%s'.", d.dependency, p.vers); - actions ~= Action.install(pkg, InstallLocation.ProjectLocal, d.dependency, d.packages); + actions ~= Action.install(pkg, InstallLocation.projectLocal, d.dependency, d.packages); } else { logDebug("Required package '"~pkg~"' found with version '"~p.vers~"'"); if( option & UpdateOptions.Reinstall ) { - if( p.installLocation != InstallLocation.Local ){ + if( p.installLocation != InstallLocation.local ){ Dependency[string] em; // user and system packages are not uninstalled (could be needed by other projects) - if( p.installLocation == InstallLocation.ProjectLocal ) + if( p.installLocation == InstallLocation.projectLocal ) uninstalls ~= Action.uninstall(*p, em); actions ~= Action.install(pkg, p.installLocation, d.dependency, d.packages); } else { @@ -263,7 +263,7 @@ // Add uninstall actions foreach( pname, pkg; unused ){ - if( pkg.installLocation != InstallLocation.ProjectLocal ) + if( pkg.installLocation != InstallLocation.projectLocal ) continue; logDebug("Superfluous package found: '"~pname~"', version '"~pkg.vers~"'"); Dependency[string] em; @@ -359,7 +359,7 @@ if( p ) logTrace("Found installed package %s %s", pkg, p.ver); // Try an already installed package first - if( p && p.installLocation != InstallLocation.Local && needsUpToDateCheck(pkg) ){ + if( p && p.installLocation != InstallLocation.local && needsUpToDateCheck(pkg) ){ logInfo("Triggering update of package %s", pkg); p = null; } @@ -452,12 +452,12 @@ static Action conflict(string pkg, in Dependency dep, Dependency[string] context) { - return Action(Type.conflict, pkg, InstallLocation.ProjectLocal, dep, context); + return Action(Type.conflict, pkg, InstallLocation.projectLocal, dep, context); } static Action failure(string pkg, in Dependency dep, Dependency[string] context) { - return Action(Type.failure, pkg, InstallLocation.ProjectLocal, dep, context); + return Action(Type.failure, pkg, InstallLocation.projectLocal, dep, context); } private this(Type id, string pkg, InstallLocation location, in Dependency d, Dependency[string] issue)