* Adding prompt for project name
* Updating test
* PR feedback
* Fixing rename logic so that folder is also named according to project
* Updating autorest test to confirm rename
* Initial changes
* checkpoint
* Constructing project with post deployment script
* Correcting to intentionally read from cached list of projects
* Adding activation event, fixing fresh workspace bug
* Convert netcoreTool and autorestHelper to share a helper class for streamed command
* Include npm package version to force update
* test checkpoint
* Unit tests
* Added contextual quickpicks for autorest dialogs
* Adding projectController test
* Added projectController test, some refactoring for testability
* Merge branch 'main' into benjin/autorest
* Fixing 'which' import
* PR feedback
* Fixing tests
* Adding additional information for when project provider tests fail
* Hopefully fixing failing tests (unable to repro locally)
* Adding Generate Project item to workspace menu
* PR feedback
* Automatically add intermediate folders for SQL project items.
While using the SQL database projects through the API, I noticed that project may end up in somewhat inconsistent state, where files will be added to the project, but their parent folders will not. This in turn resulted in failure to remove these folders from project - they will show up in the UI tree, but deleting them will cause an error. In order to align with how Visual Studio manages the projects, this change will ensure that all intermediate folders are present in the project, when new files or folders are added.
While this change improves project "correctness" when accessing it through SQL projects extension APIs, there is still a possibility that someone will open an "incorrect" previously created project. This change does not address it and folder removal may still fail.
* Update the code to never throw on duplicate items when adding files and folders to project.
After a conversation with the sqlproj owners, we agreed that there are no scenarios that would prompt us to throw an error, if duplicate item is being added to the project. Ultimately, the goal of such a request would be to have an item in the project file, which is already present, therefore the call becomes a no-op.
This allowed me to simplify the new code that was ensuring all intermediate folders are present in the project when adding files and folders.
This change introduces new boolean flag for `addToProject`, `addScriptItem` and `addFolderItem` APIs that allows to skip files/folders if they are already included in the project file. Original behavior was to throw an error if duplicate entry is encountered, so I kept that as a default (new flag is not set).
I started by fixing the original behavior, as it was not always working as expected. In our extension that relies on `addToProject` API we've hit an issue where duplicate items were added and no errors were thrown. There was a test for this scenario, but unfortunately the test had few bugs in it as well, so I addressed that first. First issue with the test code was missing `await` on the `testUtils.shouldThrowSpecificError` calls, so test was not actually testing anything. After adding missing keywords, I hit an issue where exception was not thrown, but this turned out to be different issue, compared to what we were hitting. In the test code, it was using the very first folder from the generate list of test entires. This folder wass actually the root of the project (where sqlproj file is located), and `addToProject` API had a special case to ignore the root. This means neither first call nor second call was actually adding anything to the project and no errors were produced. I fixed this problem by using next available folder in the generated files list.
After addressing the test code I could not reproduce the issue that we were seeing with duplicate entires being added, everything was working as expected and errors were thrown. I started adding more tests that better resemble our production scenario - add files in subfolders, add files to existing project, rather than a new one. Finally I was able to reproduce the problem in tests when adding a file in a subfolder to an existing project. After investigation this turned out to be an issue with mismatch in how `relativePath` is maintained within the `FileProjectEntry`. When loading an existing project, `relativePath` is populated based on the value of the `Include` attribute of the `Build` item. This attribute is normalized to Windows-style path, using `\`, so for nested file you will have `folder\file.sql`. When adding new item to the project, one could pass either Windows or Unix-style path (`folder/file.sql`), so the path comparison between loaded Windows-style path and newly added Unix-style path was failing, resulting in them being treated as different items. In fact, `addToProject` API that we were using was relying on `Uri` helpers to extract relative path, thus the path was forced to be Unix-style and path was never the same as the loaded one. After this discovery I added a dedicated test to validate the round-trip of the `relativePath` for serialized and desirialized project file.
In order to address this problem, I updated the factory method `createFileProjectEntry` to always run `utils.convertSlashesForSqlProj` on the relative path to ensure we have Windows-style path stored in there. I also optimized the helper code slightly to not do split/join, if there are no split points in the input string, which should eliminate unnecessary array instantiation. It is worth mentioning that I had to normalize the input relative paths in the `addScriptItem` and `addFolderItem` APIs, because there is no guarantee that they will be Windows-style when we try to compare them to `relativePath` of the existing project items.
Finally I was able to add a simply flag and update the condition to return existing record, if duplicates were allowed. I also updated typings file for the extension and added tests to cover this scenario.
* First set of changes for workspace dashboard implementing the toolbar
* Workspace dashboard container implementation (#14813)
* First set of changes for workspace dashboard implementing the toolbar (#14160)
* First set of changes for workspace dashboard implementing the toolbar
* Addressed comments
* Addressed one remaining comment
* Removed an extra comma in interfaces file
* Addressed comments
* Addressed comments
* Refactored a bit of code
* Remove unnecessary await
* Addressed comments
* First set of changes for workspace dashboard container
* Update targetPlatform icon+add Time column to deploy table
* Addressed comments
* Removed redundant class definition
* Addressed comments
* Addressed comments
* Change enum to union type in dataworkspace typings
* Fix tests
* Addressed comments
* Added publish and schema compare telemetry
* Adding telemetry points for add/exclude/delete
* telemetry for validation
* Adding telemetry from project roundtrip updates, editing sqlproj, and db refs
* Changed method for obtaining extension ID during registration
* Fixing test failures, updating ads telemetry package dependency
* replacing action strings with enums
* change database project string actions to enums
* Changed action name to better match dialog
* PR feedback
* adding telemetry dependencies for data-workspaces and sql-database-projects
* Adding telemetry dependencies for dacpac extension
* Adding telemetry base to data workspaces and projects
* Adding telemetry base code to the dacpac extension
Co-authored-by: Benjin Dubishar <benjin@Largo.local>
Co-authored-by: Sai Avishkar Sreerama <ssreerama@microsoft.com>
* Fix project context menu actions (#12541)
* delete works again
* make fewer changes
* update all sql db project commands
* cleanup
* Remove old projects view (#12563)
* remove old projects view from file explorer view
* fix tests failing
* remove projects in open folder opening up in old view
* Update db reference dialog to show projects in the workspace (#12580)
* update database reference dialog to show projects in the workspace in the project dropdown
* remove workspace stuff from sql projects extension
* undo change
* add class that implements IExtension
* undo a change
* update DataWorkspaceExtension to take workspaceService as a parameter
* add type
* Update sql database project commands (#12595)
* remove sql proj's open and create new project from comman palette
* hook up create project from database to data workspace
* rename the remaining import databases to create project from database
* remove open, new, and close commands
* expose addProjectsToWorkspace() in IExtension instead of calling command
* Addressing comments
* fix failing sql project tests (#12651)
* update SSDT projects opened in projects viewlet (#12669)
* fix action not refreshing the tree issue (#12692)
* fix adding project references in new projects viewlet (#12688)
* Remove old projects tree provider (#12702)
* Remove old projects tree provider and fix tests
* formatting
* update refreshProjectsTree() to accept workspaceTreeItem()
* Cleanup ProjectsController (#12718)
* remove openProject from ProjectController and some cleanup
* rename
* add project and open project dialogs (#12729)
* empty dialogs
* wip
* new project dialog implementation
* revert gitattributes
* open project dialog
* implement add project
* remove icon helper
* refactor
* revert script change
* adjust views
* more updates
* make data-workspace a builtin extension
* show the view only when project provider is detected (#12819)
* only show the view when proj provider is available
* update
* fix sql project tests after merge (#12793)
* Update dialogs to be closer to mockups (#12879)
* small UI changes to dialogs
* center radio card group text
* Create workspace if needed when opening/new project (#12930)
* empty dialogs
* wip
* new project dialog implementation
* revert gitattributes
* open project dialog
* implement add project
* remove icon helper
* refactor
* revert script change
* create workspace
* initial changes
* create new workspace working
* fix tests
* cleanup
* remove showWorkspaceRequiredNotification()
* Add test for no workspace open
* update blue buttons
* move loading temp project to activate() instead of workspaceService constructor
* move workspace creation warning message to before project is created
* pass uri to createWorkspace
* add tests
Co-authored-by: Alan Ren <alanren@microsoft.com>
* Additional create workspace changes (#13004)
* Dialogs workspace updates (#13010)
* adding workspace text boxes
* match new project dialog to mockups
* Add validation error message for workspace file
* add enterWorkspace api
* add warning message for opening workspace
* cleanup
* update commands to remove project so they're more generic
* remove 'empty' from string
* Move default project location setting to data workspace extension (#13022)
* remove project location setting and notification from sql database projects extension
* add default project location setting to data workspace extension
* fix typo
* Add back project name incrementing
* other merge fixes
* fix strings from other PR
* default to last opened directory instead of home directory if no specified default location
* A few small updates (#13092)
* fix build error
* update title for inputboxes
* add missing file
* Add tests for data workspace dialogs (#13324)
* add tests for dialogs
* create helper functions
* New project dialog workspace inputbox fixes (#13407)
* workspace inputbox fixes
* fix folder icons
* Update package.jsons and readme (#13451)
* update package.jsons
* update readme
* add workspace information to open existing dialog (#13455)
Co-authored-by: Alan Ren <alanren@microsoft.com>
* show default values in text boxes
* add sqlcmd formatting
* add tests
* Add some sqlcmd variable name validation
* Addressing comments
* fixes after merge
* fix test
* don't localize OtherServer
* fix for windows
* one more fix
* fix test
* add projects to add database reference dialog
* able to add project references
* check for circular dependency
* only allow adding reference to project in the same workspace
* fix location dropdown when project reference is enabled
* add tests
* more tests
* cleanup
* fix flakey test
* addressing comments
* allow relative paths in project file outside of project folder
* Adding some tests
* Adding error string to loc strings
* Fixed test
* fix error message
* PR comments and some more fixes
* initial changes for reading connection from profile
* connection string can now be read from publish.xml
* fix build errors and update test
* move publish profile tests to their own file
* cleanup
* update message
* fix string
* remove apiWrapper
* udpate import to have friendly names for the extract file organization options
* update tests
* update message
* remove camelcase stuff
* use localized constants instead of enum
* fix for windows path to show in project tree across platforms correctly
* allow retrying on project that failed to load
* test for project failed to load case
* Adding platform safe uri for database ref in tree
* load database name from profile.xml
* load sqlcmd variables from profile
* Add warning text
* add tests
* fix file filter for windows
* add comments
* show SQLCMD variables in a table
* reset dialog before testing readPublishProfile callback
* Initial changes for Import database as new project
* Functionally complete code
* Initial changes for Import database as new project
* Functionally complete code
* Resolved conflicts with latest changes. Also did some code refactoring.
* Addressed comments. Added unit tests.
* Addressed comments
* Moved ExtractTarget enum from azdata to mssql
* Addressed comments
* Fixed indentation in project templates
* add support for schema compare to specify source dacpac
* add build and dacpac produced from build
* check if dacpac exists
* add tests
* move exists check code to utils
* fix test run failing
* initial build command execution
* adding tests
* Clean up test names
* update SqltoolsService release in ADS for Build
* Updating as per PR comments
* updating yarn lock
* Adding one more test for command run
* Test fixes
* Checkpoint
* Adding mock contents for tree
* added open sqlproj dialog
* reading files from directory
* Added directory traversal
* Adding tree sorting by folder vs file and label
* Improved auto-unfolding of tree based on node type
* replacing fs with fs.promise alias
* PR feedback
* added activation event for when workspace contains sqlproj files
* Returning after displaying error
* Fixing linter errors
* Reworked tree
* Fixing missing grandchildren
* Correcting tree URI construction
* Refactoring to isolate tree item responsibilities from data model responsibilities
* project file parsing
* constructing tree from project files rather than filesystem
* Fixing double-initialization
* Changing projectEntry to take enum for file type
* Correct node type for project item
* Parsing datasources.json
* Child nodes for sql data source
* Localizing strings
* Checkpoint
* Adding mock contents for tree
* added open sqlproj dialog
* reading files from directory
* Added directory traversal
* Adding tree sorting by folder vs file and label
* Improved auto-unfolding of tree based on node type
* replacing fs with fs.promise alias
* PR feedback
* added activation event for when workspace contains sqlproj files
* Returning after displaying error
* Fixing linter errors
* Reworked tree
* Fixing missing grandchildren
* Correcting tree URI construction
* Refactoring to isolate tree item responsibilities from data model responsibilities
* project file parsing
* constructing tree from project files rather than filesystem
* Fixing double-initialization
* Changing projectEntry to take enum for file type
* Correct node type for project item
* Parsing datasources.json
* Child nodes for sql data source
* Localizing strings
* missed file in merge
* changed extension method to helper
* cleanup
* Adding docstrings
* Adding mock contents for tree
* added open sqlproj dialog
* reading files from directory
* Added directory traversal
* Adding tree sorting by folder vs file and label
* Improved auto-unfolding of tree based on node type
* replacing fs with fs.promise alias
* added activation event for when workspace contains sqlproj files
* Returning after displaying error